{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
    "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.13.1\n",
      "sys.version_info(major=3, minor=5, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.4\n",
      "pandas 0.24.2\n",
      "sklearn 0.21.2\n",
      "tensorflow 1.13.1\n",
      "tensorflow._api.v1.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import pandas as pd\n",
    "import sklearn\n",
    "import sys\n",
    "import tensorflow as tf\n",
    "import time\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('./cifar10/train/1.png', 'frog'),\n",
      " ('./cifar10/train/2.png', 'truck'),\n",
      " ('./cifar10/train/3.png', 'truck'),\n",
      " ('./cifar10/train/4.png', 'deer'),\n",
      " ('./cifar10/train/5.png', 'automobile')]\n",
      "[('./cifar10/test/1.png', 'cat'),\n",
      " ('./cifar10/test/2.png', 'cat'),\n",
      " ('./cifar10/test/3.png', 'cat'),\n",
      " ('./cifar10/test/4.png', 'cat'),\n",
      " ('./cifar10/test/5.png', 'cat')]\n",
      "50000 300000\n"
     ]
    }
   ],
   "source": [
    "class_names = [\n",
    "    'airplane',\n",
    "    'automobile',\n",
    "    'bird',\n",
    "    'cat',\n",
    "    'deer',\n",
    "    'dog',\n",
    "    'frog',\n",
    "    'horse',\n",
    "    'ship',\n",
    "    'truck',\n",
    "]\n",
    "\n",
    "train_lables_file = './cifar10/trainLabels.csv'\n",
    "test_csv_file = './cifar10/sampleSubmission.csv'\n",
    "train_folder = './cifar10/train/'\n",
    "test_folder = './cifar10/test'\n",
    "\n",
    "def parse_csv_file(filepath, folder):\n",
    "    \"\"\"Parses csv files into (filename(path), label) format\"\"\"\n",
    "    results = []\n",
    "    with open(filepath, 'r') as f:\n",
    "        lines = f.readlines()[1:]\n",
    "    for line in lines:\n",
    "        image_id, label_str = line.strip('\\n').split(',')\n",
    "        image_full_path = os.path.join(folder, image_id + '.png')\n",
    "        results.append((image_full_path, label_str))\n",
    "    return results\n",
    "\n",
    "train_labels_info = parse_csv_file(train_lables_file, train_folder)\n",
    "test_csv_info = parse_csv_file(test_csv_file, test_folder)\n",
    "\n",
    "import pprint\n",
    "pprint.pprint(train_labels_info[0:5])\n",
    "pprint.pprint(test_csv_info[0:5])\n",
    "print(len(train_labels_info), len(test_csv_info))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                filepath       class\n",
      "0  ./cifar10/train/1.png        frog\n",
      "1  ./cifar10/train/2.png       truck\n",
      "2  ./cifar10/train/3.png       truck\n",
      "3  ./cifar10/train/4.png        deer\n",
      "4  ./cifar10/train/5.png  automobile\n",
      "                    filepath       class\n",
      "0  ./cifar10/train/45001.png       horse\n",
      "1  ./cifar10/train/45002.png  automobile\n",
      "2  ./cifar10/train/45003.png        deer\n",
      "3  ./cifar10/train/45004.png  automobile\n",
      "4  ./cifar10/train/45005.png    airplane\n",
      "               filepath class\n",
      "0  ./cifar10/test/1.png   cat\n",
      "1  ./cifar10/test/2.png   cat\n",
      "2  ./cifar10/test/3.png   cat\n",
      "3  ./cifar10/test/4.png   cat\n",
      "4  ./cifar10/test/5.png   cat\n"
     ]
    }
   ],
   "source": [
    "# train_df = pd.DataFrame(train_labels_info)\n",
    "train_df = pd.DataFrame(train_labels_info[0:45000])\n",
    "valid_df = pd.DataFrame(train_labels_info[45000:])\n",
    "test_df = pd.DataFrame(test_csv_info)\n",
    "\n",
    "train_df.columns = ['filepath', 'class']\n",
    "valid_df.columns = ['filepath', 'class']\n",
    "test_df.columns = ['filepath', 'class']\n",
    "\n",
    "print(train_df.head())\n",
    "print(valid_df.head())\n",
    "print(test_df.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 45000 images belonging to 10 classes.\n",
      "Found 5000 images belonging to 10 classes.\n",
      "45000 5000\n"
     ]
    }
   ],
   "source": [
    "height = 32\n",
    "width = 32\n",
    "channels = 3\n",
    "batch_size = 32\n",
    "num_classes = 10\n",
    "\n",
    "train_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    rescale = 1./255,\n",
    "    rotation_range = 40,\n",
    "    width_shift_range = 0.2,\n",
    "    height_shift_range = 0.2,\n",
    "    shear_range = 0.2,\n",
    "    zoom_range = 0.2,\n",
    "    horizontal_flip = True,\n",
    "    fill_mode = 'nearest',\n",
    ")\n",
    "train_generator = train_datagen.flow_from_dataframe(\n",
    "    train_df,\n",
    "    directory = './',\n",
    "    x_col = 'filepath',\n",
    "    y_col = 'class',\n",
    "    classes = class_names,\n",
    "    target_size = (height, width),\n",
    "    batch_size = batch_size,\n",
    "    seed = 7,\n",
    "    shuffle = True,\n",
    "    class_mode = 'sparse',\n",
    ")\n",
    "\n",
    "valid_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    rescale = 1./255)\n",
    "valid_generator = valid_datagen.flow_from_dataframe(\n",
    "    valid_df,\n",
    "    directory = './',\n",
    "    x_col = 'filepath',\n",
    "    y_col = 'class',\n",
    "    classes = class_names,\n",
    "    target_size = (height, width),\n",
    "    batch_size = batch_size,\n",
    "    seed = 7,\n",
    "    shuffle = False,\n",
    "    class_mode = \"sparse\")\n",
    "\n",
    "train_num = train_generator.samples\n",
    "valid_num = valid_generator.samples\n",
    "print(train_num, valid_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(32, 32, 32, 3) (32,)\n",
      "[2. 1. 4. 4. 4. 4. 6. 5. 2. 8. 4. 6. 6. 3. 7. 1. 7. 2. 8. 8. 3. 0. 5. 3.\n",
      " 9. 1. 4. 5. 6. 7. 9. 2.]\n",
      "(32, 32, 32, 3) (32,)\n",
      "[0. 7. 2. 7. 5. 5. 7. 0. 5. 4. 9. 7. 6. 3. 0. 4. 4. 4. 6. 3. 5. 4. 6. 6.\n",
      " 4. 1. 8. 2. 4. 4. 3. 0.]\n"
     ]
    }
   ],
   "source": [
    "for i in range(2):\n",
    "    x, y = train_generator.next()\n",
    "    print(x.shape, y.shape)\n",
    "    print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 32, 32, 128)       3584      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1 (Batc (None, 32, 32, 128)       512       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 32, 32, 128)       147584    \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1_1 (Ba (None, 32, 32, 128)       512       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 16, 16, 128)       0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 16, 16, 256)       295168    \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1_2 (Ba (None, 16, 16, 256)       1024      \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 16, 16, 256)       590080    \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1_3 (Ba (None, 16, 16, 256)       1024      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 8, 8, 256)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 8, 8, 512)         1180160   \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1_4 (Ba (None, 8, 8, 512)         2048      \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 8, 8, 512)         2359808   \n",
      "_________________________________________________________________\n",
      "batch_normalization_v1_5 (Ba (None, 8, 8, 512)         2048      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 4, 4, 512)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 8192)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 512)               4194816   \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                5130      \n",
      "=================================================================\n",
      "Total params: 8,783,498\n",
      "Trainable params: 8,779,914\n",
      "Non-trainable params: 3,584\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',\n",
    "                        activation='relu', \n",
    "                        input_shape=[width, height, channels]),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    keras.layers.Conv2D(filters=256, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Conv2D(filters=256, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(filters=512, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Conv2D(filters=512, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Flatten(),\n",
    "    keras.layers.Dense(512, activation='relu'),\n",
    "    keras.layers.Dense(num_classes, activation='softmax'),\n",
    "])\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=\"adam\", metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "157/157 [==============================] - 5s 35ms/step - loss: 1.6870 - acc: 0.3806\n",
      "1407/1407 [==============================] - 631s 449ms/step - loss: 2.5543 - acc: 0.2675 - val_loss: 1.6870 - val_acc: 0.3806\n",
      "Epoch 2/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.7154 - acc: 0.4232\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 1.7151 - acc: 0.3767 - val_loss: 1.7154 - val_acc: 0.4232\n",
      "Epoch 3/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.7433 - acc: 0.4360\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 1.5059 - acc: 0.4543 - val_loss: 1.7433 - val_acc: 0.4360\n",
      "Epoch 4/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.1556 - acc: 0.6002\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 1.3400 - acc: 0.5198 - val_loss: 1.1556 - val_acc: 0.6002\n",
      "Epoch 5/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.0857 - acc: 0.6226\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 1.1878 - acc: 0.5788 - val_loss: 1.0857 - val_acc: 0.6226\n",
      "Epoch 6/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.0947 - acc: 0.6430\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 1.0565 - acc: 0.6303 - val_loss: 1.0947 - val_acc: 0.6430\n",
      "Epoch 7/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.7530 - acc: 0.7496\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 0.9525 - acc: 0.6676 - val_loss: 0.7530 - val_acc: 0.7496\n",
      "Epoch 8/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 1.2433 - acc: 0.6230\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 0.8687 - acc: 0.7010 - val_loss: 1.2433 - val_acc: 0.6230\n",
      "Epoch 9/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.6869 - acc: 0.7760\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.8051 - acc: 0.7236 - val_loss: 0.6869 - val_acc: 0.7760\n",
      "Epoch 10/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.7114 - acc: 0.7798\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.7481 - acc: 0.7428 - val_loss: 0.7114 - val_acc: 0.7798\n",
      "Epoch 11/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.6984 - acc: 0.7746\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 0.7112 - acc: 0.7580 - val_loss: 0.6984 - val_acc: 0.7746\n",
      "Epoch 12/20\n",
      "157/157 [==============================] - 3s 19ms/step - loss: 0.5960 - acc: 0.8136\n",
      "1407/1407 [==============================] - 93s 66ms/step - loss: 0.6698 - acc: 0.7698 - val_loss: 0.5960 - val_acc: 0.8136\n",
      "Epoch 13/20\n",
      "157/157 [==============================] - 3s 19ms/step - loss: 0.5687 - acc: 0.8196\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.6366 - acc: 0.7813 - val_loss: 0.5687 - val_acc: 0.8196\n",
      "Epoch 14/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.7316 - acc: 0.7654\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 0.6090 - acc: 0.7940 - val_loss: 0.7316 - val_acc: 0.7654\n",
      "Epoch 15/20\n",
      "157/157 [==============================] - 3s 20ms/step - loss: 0.5415 - acc: 0.8276\n",
      "1407/1407 [==============================] - 91s 65ms/step - loss: 0.5821 - acc: 0.8022 - val_loss: 0.5415 - val_acc: 0.8276\n",
      "Epoch 16/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.6255 - acc: 0.8126\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.5611 - acc: 0.8073 - val_loss: 0.6255 - val_acc: 0.8126\n",
      "Epoch 17/20\n",
      "157/157 [==============================] - 3s 19ms/step - loss: 0.5124 - acc: 0.8350\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.5346 - acc: 0.8194 - val_loss: 0.5124 - val_acc: 0.8350\n",
      "Epoch 18/20\n",
      "157/157 [==============================] - 3s 18ms/step - loss: 0.5804 - acc: 0.8248\n",
      "1407/1407 [==============================] - 92s 65ms/step - loss: 0.5129 - acc: 0.8261 - val_loss: 0.5804 - val_acc: 0.8248\n",
      "Epoch 19/20\n",
      "157/157 [==============================] - 3s 20ms/step - loss: 0.5762 - acc: 0.8194\n",
      "1407/1407 [==============================] - 99s 71ms/step - loss: 0.4913 - acc: 0.8332 - val_loss: 0.5762 - val_acc: 0.8194\n",
      "Epoch 20/20\n",
      "157/157 [==============================] - 3s 19ms/step - loss: 0.5128 - acc: 0.8442\n",
      "1407/1407 [==============================] - 101s 72ms/step - loss: 0.4836 - acc: 0.8359 - val_loss: 0.5128 - val_acc: 0.8442\n"
     ]
    }
   ],
   "source": [
    "epochs = 20\n",
    "history = model.fit_generator(train_generator,\n",
    "                              steps_per_epoch = train_num // batch_size,\n",
    "                              epochs = epochs,\n",
    "                              validation_data = valid_generator,\n",
    "                              validation_steps = valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epcohs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history, 'loss', epochs, 0, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 300000 images belonging to 10 classes.\n",
      "300000\n"
     ]
    }
   ],
   "source": [
    "test_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    rescale = 1./255)\n",
    "test_generator = valid_datagen.flow_from_dataframe(\n",
    "    test_df,\n",
    "    directory = './',\n",
    "    x_col = 'filepath',\n",
    "    y_col = 'class',\n",
    "    classes = class_names,\n",
    "    target_size = (height, width),\n",
    "    batch_size = batch_size,\n",
    "    seed = 7,\n",
    "    shuffle = False,\n",
    "    class_mode = \"sparse\")\n",
    "test_num = test_generator.samples\n",
    "print(test_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_predict = model.predict_generator(test_generator,\n",
    "                                       workers = 10,\n",
    "                                       use_multiprocessing = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(300000, 10)\n"
     ]
    }
   ],
   "source": [
    "print(test_predict.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.8115582e-02 3.0195517e-02 9.7707666e-02 2.2199485e-01 9.6216276e-02\n",
      "  1.4796969e-02 3.6596778e-01 2.3226894e-02 1.2524511e-02 1.1925392e-01]\n",
      " [9.3144512e-01 2.5595291e-04 3.6763612e-02 9.3153082e-03 9.9368917e-04\n",
      "  9.1112546e-05 1.5013785e-02 3.5342187e-04 5.2798474e-03 4.8821873e-04]\n",
      " [7.2171527e-04 8.8273185e-01 3.1592429e-06 1.9850962e-05 2.2674351e-06\n",
      "  1.8648565e-06 1.6326395e-06 1.5337924e-05 6.6775086e-05 1.1643546e-01]\n",
      " [1.7911234e-05 7.6694396e-06 7.3977681e-06 1.4877276e-06 1.0498322e-06\n",
      "  2.0850619e-07 1.4016325e-06 4.9560447e-07 9.9995601e-01 6.3446323e-06]\n",
      " [9.0831274e-01 1.8281976e-04 6.2809147e-02 1.6991662e-02 8.5249258e-04\n",
      "  4.1505805e-04 3.8536564e-03 6.0711574e-04 5.2569183e-03 7.1851560e-04]]\n"
     ]
    }
   ],
   "source": [
    "print(test_predict[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_predict_class_indices = np.argmax(test_predict, axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[6 0 1 8 0]\n"
     ]
    }
   ],
   "source": [
    "print(test_predict_class_indices[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_predict_class = [class_names[index] \n",
    "                      for index in test_predict_class_indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['frog', 'airplane', 'automobile', 'ship', 'airplane']\n"
     ]
    }
   ],
   "source": [
    "print(test_predict_class[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_submissions(filename, predict_class):\n",
    "    with open(filename, 'w') as f:\n",
    "        f.write('id,label\\n')\n",
    "        for i in range(len(predict_class)):\n",
    "            f.write('%d,%s\\n' % (i+1, predict_class[i]))\n",
    "\n",
    "output_file = \"./cifar10/submission.csv\"\n",
    "generate_submissions(output_file, test_predict_class)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
